package com.jason.library.scope

/**
 * @description: RunScopeFunctionMain
 *
 * @author ChenBaoyang
 * @date 6/30/21 14:38
 */
object RunScopeFunctionMain{

    @JvmStatic
    fun main(args: Array<String>) {
        runCharacteristic1()
        runCharacteristic2()
    }
}


/**
 * run也是默认是有返回语句，以“this”作为上下文对象
 * 当 lambda 表达式同时包含对象初始化和返回值的计算时，run更适合
 * 形式1：inline fun <T, R> T.run(block: T.() -> R): R   ：  作为T的扩展函数
 */
fun runCharacteristic1() {
    //未用run作用域
    val book = Book()
    book.name = "《计算机网络》"
    book.price = 30
    book.displayInfo()

    //用run作用域
    val book1 =  Book().run {
        name = "《计算机网络》"
        price = 30
        displayInfo()
    }
    println(book1)
}

/**
 * 它不是扩展函数，并且块中也没有输入值，因此，它不是用于传递对象并更改属性的类型，而是可以使你在需要表达式的地方就可以执行一个语句
 * 形式2：inline fun <R> run(block: () -> R): R
 */
fun runCharacteristic2() {
    //作为一个函数块执行
    run {
        val book = Book()
        book.name = "《计算机网络》"
        book.price = 30
        book.displayInfo()
    }
}